<?php

namespace app\api\controller;

use think\Controller;
use think\response\Json;
use app\api\model\UserModel;
use app\api\validate\UserValidate;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

class Auth extends Controller
{
    /**
     * 用户登录
     *
     * @return Json
     *
     * @date    2019/06/01 21:40
     * @throws \Exception
     */
    public function login()
    {
        $method = $this->request->method();
        if ($method != 'POST') {
            return json('请求类型错误');
        }
        $request  = $this->request->post();
        $validate = new UserValidate();
        if (!$validate->scene('login')->check($request)) {
            return json($validate->getError());
        }
        $username  = $request['username'];
        $password  = $request['password'];
        $userModel = new UserModel();
        $result    = $userModel->where('username', $username)->find();
        if (!$result) {
            return json('账户不存在', 201);
        }
        if (md5($password) != $result['password']) {
            return json('账户密码不匹配', 201);
        }
        unset($result['password']);
        session('userInfo', $result);
        return json($result, 200);
    }

    /**
     * description
     *
     * @return Json
     *
     * @date    2019/06/01 21:47
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function register()
    {
        // 获取请求方式
        $method = $this->request->method();
        if ($method != 'POST') {
            return json(['message' => '请求类型错误'], 201);
        }
        // 获取请求数据
        $request = $this->request->post();
        $code    = $request['code'];
        // 判断验证码
        if ($code != session('code')) {
            return json(['message' => '验证码错误'], 201);
        }
        // 参数验证器
        $validate = new UserValidate();
        if (!$validate->scene('register')->check($request)) {
            return json($validate->getError());
        }
        $username  = $request['username'];
        $password  = $request['password'];
        $email     = $request['email'];
        $userModel = new UserModel();
        // 通过用户名获取用户信息
        $userResult = $userModel->where('username', $username)->find();
        if (!$userResult) {
            return json(['message' => '用户名已存在'], 201);
        }
        // 通过邮箱获取 判断邮箱是否超限
        $emailResult = $userModel->where('email', $email)->select();
        if (count($emailResult) >= 2) {
            return json(['message' => '邮箱注册上限'], 201);
        }
        $data = [
            'username' => $username,
            'password' => $password,
            'email'    => $email
        ];
        // 将用户信息储存到数据库
        $response = $userModel->insert($data);
        if ($response) {
            session('code');
            return json(['message' => '注册成功'], 200);
        }
        return json(['message' => '注册失败'], 201);
    }

    /**
     * 用户退出
     *
     * @return Json
     *
     * @date    2019/06/01 22:07
     */
    public function logout()
    {
        session('user');
        return json(['message' => '退出成功']);
    }

    /**
     * 发送邮件
     *
     * @return Json
     *
     * @date    2019/06/01 22:53
     * @throws Exception
     */
    public function sendEmail()
    {
        // 获取请求方式
        $method = $this->request->method();
        if ($method != 'POST') {
            return json(['message' => '请求类型错误'], 201);
        }
        $email           = $this->request->post('email');
        $mail            = new PHPMailer();
        $mail->SMTPDebug = 1;
        $mail->isSMTP();
        $mail->SMTPAuth = true;
        //链接qq域名邮箱的服务器地址
        $mail->Host       = 'smtp.exmail.qq.com';
        $mail->SMTPSecure = 'ssl';
        $mail->Port       = 465;
        //设置发件人的主机域 可有可无 默认为localhost 内容任意，建议使用你的域名
        $mail->Hostname = 'localhost';
        $mail->CharSet  = 'UTF-8';
        //设置发件人姓名（昵称） 任意内容，显示在收件人邮件的发件人邮箱地址前的发件人姓名
        $mail->FromName = '系统管理员';
        //登录的账号 这里填入字符串格式的qq号即可
        $mail->Username = 'admin@hzxin.cn';
        //登录的密码 使用生成的授权码 你的最新的授权码
        $mail->Password = 'Wang2017.yy';
        //设置发件人邮箱地址 这里填入上述提到的“发件人邮箱”
        $mail->From = 'admin@hzxin.cn';
        //邮件正文是否为html编码 注意此处是一个方法 不再是属性 true或false
        $mail->isHTML(true);
        $mail->addAddress($email, '注册通知');
        //添加该邮件的主题
        $mail->Subject = '新用户注册';

        $code       = rand(000000, 999999);
        $mail->Body = '您本次注册的验证码为：' . $code;

        $status = $mail->send();
        session('code', $code);
        //简单的判断与提示信息
        if (!$status) {
            return json(['message' => '发送失败'], 201);
        }
        return json(['message' => '发送成功']);
    }
}